#include<stdio.h>
#include<string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include"session.h"
#include"tcp.h"
/*
命令包数据格式：（协议）
0xc0(包头)	命令号(1个字节) 参数长度(1个字节) 参数内容(N个字节)  0xc0(包尾)
*/


//发送ls命令给服务端，并接收服务端回复的数据
void lsCmd(int sockfd)
{
	unsigned char cmd[32];
	int i=0;
	cmd[i] = 0xc0;//包头
	i++;
	cmd[i] = FTP_LS_CMD;//命令号
	i++;
	cmd[i] = 0;//参数长度
	i++;
				//参数内容为空
	cmd[i] = 0xc0;//包尾
	i++;
	int r = sendData(sockfd,cmd,i);
	printf("r=%d\n",r);
	
	unsigned char resp[32];
	r = recvData(sockfd,resp,3);//接收服务端的是否成功的数据包
	printf("r=%d\n",r);

	unsigned char pathname[1024];
	if(resp[0]==0xc0 && resp[r-1]==0xc0)
	{
		//有效数据
		if(resp[1]==OK)
		{
			//接着接收服务端发送过来的数据
			int r = recvData(sockfd,pathname,1024);
			pathname[r] = '\0';
			printf("%s\n",pathname);
		}
		else
		{
			
			return ;
		}
	}
	
	
}

void downloadFile(int sockfd,const char * filename)
{
	unsigned char cmd[32];
	int i=0;
	cmd[i] = 0xc0;//包头
	i++;
	cmd[i] = FTP_DOWNLOAD_CMD;//命令号
	i++;
	int len = strlen(filename);
	cmd[i] = len+1;//参数长度
	printf("%d\n",cmd[i]);
	i++;
	
	strncpy(&cmd[i],filename,len+1);	//参数内容
	i+=len+1;
	cmd[i] = 0xc0;//包尾
	i++;
	int r = sendData(sockfd,cmd,i);
	printf("r=%d\n",r);
	
	unsigned char resp[32];
	r = recvData(sockfd,resp,3);//接收服务端的是否成功的数据包
	printf("r=%d\n",r);
	
	for(i=0;i<r;i++)
		printf("%d ",resp[i]);
	printf("\n");
	
	
	unsigned char filedata[1024];
	if(resp[0]==0xc0 && resp[r-1]==0xc0)
	{
		
		//有效数据
		if(resp[1]==OK)
		{
			//接着接收服务端发送过来的数据
			//把收到的数据存到客户端本地文件中
			char pathname[100] = "";
			sprintf(pathname,"%s/%s",PATHNAME,filename);
			printf("%s\n",pathname);
			int fd = open(pathname,O_WRONLY | O_CREAT | O_TRUNC,0664);
			if(fd==-1)
			{
				perror("open fail");
			}
			while(1)//循环接收，直到收到服务端发来的最后一个包
			{
				char filedata[1024];
				int r = recvData(sockfd,filedata,1024);
				
				write(fd,filedata+3,r-4);//真正文件数据是从filename[3]开始的，并且最后一个字节是包尾
				
				if(filedata[2] == 1)
				{
					break;
				}
			}
			close(fd);
		}
		else
		{
			
			return ;
		}
	}	
}

void uploadFile(int sockfd,const char * filename)
{
	//上传文件的话
	//肯定首先要告诉服务器我要上传文件的名字
	//服务器发送一个ok后，开始上传
	unsigned char cmd[32];
	int i=0;
	cmd[i] = 0xc0;//包头
	i++;
	cmd[i] = FTP_UPLOAD_CMD;//命令号
	i++;
	int len = strlen(filename);
	cmd[i] = len+1;//参数长度
	printf("%d\n",cmd[i]);
	i++;
	
	strncpy(&cmd[i],filename,len+1);	//参数内容
	i+=len+1;
	cmd[i] = 0xc0;//包尾
	i++;
	int r = sendData(sockfd,cmd,i);
	printf("r=%d\n",r);
	
	unsigned char resp[32];
	r = recvData(sockfd,resp,3);//接收服务端的是否成功的数据包
	printf("r=%d\n",r);
	
	for(i=0;i<r;i++)
		printf("%d ",resp[i]);
	printf("\n");

//如果接收到了ok信号
	if(resp[0]==0xc0 && resp[r-1]==0xc0)
	{
		//有效数据
		if(resp[1]==OK)
		{
			printf("已经接收到服务端ok指令，准备上传数据----\n");
			printf("正在确认是否能够打开上传的文件----\n");
			char pathname[100] = "";
			unsigned char data[32];
			int ok = OK;
			sprintf(pathname,"%s/%s",PATHNAME,filename);
			printf("%s\n",pathname);
			int fd = open(pathname,O_RDONLY);	
			if(fd == -1)
			{
				perror("");
				ok = ERROR;	
			}
			int i = 0;
			data[i] = 0xc0;
			i++;
			data[i] = ok;
			i++;
			data[i] = 0xc0;
			i++;
			sendData(sockfd,data,i);//回复是否成功

			if(ok==OK)//如果成功继续发送文件内容
			{
				printf("已经成功打开，开始上传数据----\n");
				char filedata[1024];
				while(1)//循环发送数据，直到全部发送完毕
				{
					int i=0;
					filedata[i++] = 0xc0;//包头
					filedata[i++] = FTP_UPLOAD_CMD;
					//data[2] 表示是否为最后一个包，为1时表示是最后一个
					//为0时表示不是最后一个
					int r = read(fd,&filedata[3],1020);
					if(r == 1020)
					{
						filedata[2] = 0;//
					}
					else if(r < 1020)
					{
						filedata[2] = 1;
					}
					
					filedata[r+3] = 0xc0;
					
					sendData(sockfd,filedata,r+4);
					
					if(r < 1020)
					{
						break;
					}
				}
				close(fd);
			}
			
		}
		else
		{
			
			return ;
		}
	}	

}

int Closecmd(int sockfd)
{
	//关闭命令，很明显肯定双方都要断开连接
	//所以客户先发送命令到服务端，然后服务端根据这个命令断开连接并退出
	//在退出之前，回复服务端一个ok指令，然后客户端也断开连接
	unsigned char cmd[32];
	int i=0;
	cmd[i] = 0xc0;//包头
	i++;
	cmd[i] = FTP_CLOSE_CMD;//命令号
	i++;
	cmd[i] = 0;//参数长度
	i++;
				//参数内容为空
	cmd[i] = 0xc0;//包尾
	i++;
	int r = sendData(sockfd,cmd,i);
	printf("r=%d\n",r);
	
	unsigned char resp[32];
	r = recvData(sockfd,resp,3);//接收服务端的是否成功的数据包
	printf("r=%d\n",r);

	unsigned char pathname[1024];
	if(resp[0]==0xc0 && resp[r-1]==0xc0)
	{
		//有效数据
		if(resp[1]==OK)
		{
			//接着接收服务端发送过来的数据
			printf("客户端断开连接\n");
			close(sockfd);
			return -1;
		}
		else
		{
			
			return -1;
		}
	}	
}
















